Мы с Вами будет создавать проект вот для такой структуры данных. Здесь в таблице All собраны ссылки на книги и людей.

Создаем проект с именем TestDao3 на базе диалогового окна. Кнопку на окно. Добавляем панель диалога IDD_DIALOG_DAO, для нем создаем класс CAllDialog. Переделываем его в наследника от CDaoDialog. Ну и сразу вызов его при нажатии на кнопку.
void CTestDao3Dlg::OnButton1()
{
CAllDialog cd;
cd.DoModal();
}
Создаем три набора записей для трех таблиц.
CAllSet CBookSet CPipleSet
Подключаем их все для нашего класса диалога.
/////////////////////// // CAllDialog dialog #include "AllSet.h" #include "BookSet.h" #include "PipleSet.h" class CAllDialog : public CDaoDialog ......
Для диалога делам набор записей CAllSet как Foreign Class. А остальные классы набора записей делаем, как обычные члены класса.
class CAllDialog : public CDaoDialog
{
// Construction
public:
CAllDialog(CWnd* pParent = NULL); // standard constructor
CBookSet cbookset;
CPipleSet cpipleset;
// Dialog Data
......
}
Помещаем на диалог два ComboBox, но связываем их с нашим классом CDaoCombo.

Инициализация - деинициализация:
CAllDialog::CAllDialog(CWnd* pParent /*=NULL*/)
: CDaoDialog(CAllDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CAllDialog)
m_pSet = NULL;
//}}AFX_DATA_INIT
m_pSet = new CAllSet();
m_pSet->Open();
SetRecordset(m_pSet);
m_Book.SetRecordset(&cbookset);
m_Piple.SetRecordset(&cpipleset);
}
void CAllDialog::OnDestroy()
{
CDialog::OnDestroy();
delete m_pSet;
}
Напишем функцию которая устанавливает поле в CDaoCombo.
void CAllDialog::UpdateCombo()
{
m_Book.SetRecord(m_pSet->m_ID_BOOK);
m_Piple.SetRecord(m_pSet->m_ID_PIPLE);
}
Перегрузим OnInitDialog() для настройки наборов записей.
BOOL CAllDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// для правильного отображения первой записи
m_Book.SetRecordset(&cbookset);
m_Book.SetIndex("ID_BOOK");
m_Book.SetFields("NAME_BOOK");
m_Book.GetRecord();
m_Piple.SetRecordset(&cpipleset);
m_Piple.SetFields("NAME_PIPLE");
m_Piple.SetIndex("ID_PIPLE");
m_Piple.GetRecord();
UpdateCombo(); // обновить Combo
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
А вот теперь и воспользуемся нашей вирутальной функцией для того, чтобы сохранять новый выбор в Combo.
void CAllDialog::OnSave()
{
m_pSet->m_ID_BOOK=m_Book.GetIndex();
m_pSet->m_ID_PIPLE =m_Piple.GetIndex();
}
Осталось написать только функции перемещения. Одну продемонстрирую остальные догадаетесь.
void CAllDialog::OnButtonFirst()
{
First();
UpdateCombo();
}
Вот и все готово. Теперь спокойно можно перемещаться по записям и Combo будет отображать поле связанное с записью. Измените выбор поля в Combo измениться и в наборе записей CAllSet и в самой базе данных. Ну не намного это медленнее чем средства быстрой разработки. Да создать удобные классы может и долго. Но после их создания не жизнь а сказка. И скорость такая же.
